local status, mason = pcall(require, "mason")
if not status then
       vim.notify("没有找到 mason.nvim")
       return
end
mason.setup({
       ui = {
               border = "rounded",
    },
    registries = {
        "github:mason-org/mason-registry",
        "lua:mason-registry.index"
    },
       install_root_dir = require("commConf").sharePath .. "/abc/mason",
})

local mason_lspconfig
status, mason_lspconfig = pcall(require, "mason-lspconfig")
if not status then
	vim.notify("没有找到 mason-lspconfig")
	return
end

-- see https://github.com/folke/neodev.nvim
-- settings for neovim dev environment
local neodev
status, neodev = pcall(require, "neodev")
if not status then
	---@diagnostic disable-next-line: param-type-mismatch
	vim.notify("没有找到 neodev", "error")
	return
end
neodev.setup({
	library = {
		enable = true,
		plugins = { "nvim-dap-ui" },
		types = true,
	},
})

-- import lspconfig plugin safely
local lspconfig_status, lspconfig = pcall(require, "lspconfig")
if not lspconfig_status then
        return
end

-- import cmp-nvim-lsp plugin safely
local cmp_nvim_lsp_status, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp")
if not cmp_nvim_lsp_status then
        return
end

-- Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap=true, silent=true }
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts)

-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
    -- Enable completion triggered by <c-x><c-o>
    vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')

    -- Mappings.
    -- See `:help vim.lsp.*` for documentation on any of the below functions
    local bufopts = { noremap=true, silent=true, buffer=bufnr }
    vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
    vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
    vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
    vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
    vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
    vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts)
    vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
    vim.keymap.set('n', '<space>wl', function()
        print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
    end, bufopts)
    vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts)
    vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts)
    vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, bufopts)
    vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
    vim.keymap.set('n', '<space>f', function() vim.lsp.buf.format { async = true } end, bufopts)
end

-- used to enable autocompletion (assign to every lsp server config)
local capabilities = cmp_nvim_lsp.default_capabilities()

local lsp_flags = {
    -- This is the default in Nvim 0.7+
    debounce_text_changes = 150,
}

lspconfig['clangd'].setup({
    capabilities = capabilities,
    on_attach = on_attach,
    filetypes = { "h", "c", "cpp", "cc", "objc", "objcpp"},
    flags = lsp_flags,
    cmd = {"clangd", "--background-index"},
    single_file_support = true,
    root_dir = lspconfig.util.root_pattern(
          '.clangd',
          -- '.clang-tidy',
          '.clang-format'
          -- 'compile_commands.json',
          -- 'compile_flags.txt',
          -- 'configure.ac',
          -- '.git'
        )
})

mason_lspconfig.setup({
	ensure_installed = {
		"lua_ls",
		"bashls",
		"pyright",
		"tsserver",
		"gopls",
		"clangd",
		"vimls",
	},
	automatic_installation = true,
})


-- 使用neovim原生lspconfig进行language server配置
-- local servers = {
-- 	lua_ls = require("lsp.config.lua"), -- lua/lsp/config/lua.lua
-- 	bashls = require("lsp.config.bash"),
-- 	pyright = require("lsp.config.pyright"),
-- 	tsserver = require("lsp.config.tsserver"),
-- 	gopls = require("lsp.config.gopls"),
-- 	clangd = require("lsp.config.clangd"),
-- 	-- quick_lint_js = require("lsp.config.quick-lint-js"),
-- 	sqls = require("lsp.config.sqls"),
-- 	-- css html
-- 	emmet_ls = require("lsp.config.emmet-ls"),
-- 	html = require("lsp.config.html"),
-- 	cssls = require("lsp.config.css"),
-- 	-- json
-- 	jsonls = require("lsp.config.json"),
-- 	-- vim
-- 	vimls = require("lsp.config.vimls"),
-- }
-- for name, config in pairs(servers) do
-- 	if config ~= nil and type(config) == "table" then
-- 		-- 自定义初始化配置文件必须实现on_setup 方法
-- 		config.on_setup(lspconfig[name])
-- 	else
-- 		-- 使用默认参数
-- 		lspconfig[name].setup({})
-- 	end
-- end

